# -------------------------------------- #
# 这里是关于最常用的Python数据容器list的实践指南
# -------------------------------------- #
def learn_list1():
    # -------------------------------------- #
    # list创建二维列表
    # 在dp题中常见
    # -------------------------------------- #
    n = len(input())
    m = len(input())
    dp1 = [[0 for _ in range(n)] for j in range(m)]
    dp2 = [[0] * n for i in range(m)]
    dp1[0][0] = 1  # 测试二维数组dp1是否创建异常
    dp2[0][0] = 1  # 测试二维数组dp2是否创建异常
    print(dp1.__str__())
    print(dp2.__str__())
    # -------------------------------------- #
    # list创建二维列表之错误的创建方法警惕！
    # 这是一种常见的错误的创建方法，请注意警惕！
    # 这是一种常见的错误的创建方法，请注意警惕！
    # 这是一种常见的错误的创建方法，请注意警惕！
    # 原理解释：
    # 这是因为 * 运算符用于复制列表的引用，而不是创建新的列表副本。
    # 因此，当你创建 dp3 时，你实际上创建了 m 个
    # ->指向同一个内层列表 [0] * n 的引用。
    # -------------------------------------- #
    dp3 = [[0] * n] * m
    dp3[0][0] = 1  # 测试二维数组dp3是否创建异常
    print(dp3.__str__())


def learn_list2():
    # -------------------------------------- #
    # 语法
    # 用列表推导式来快速创建列表的语法讲解
    # [expression for item in iterable]
    # 其中，expression是一个表达式，用于计算列表中每个元素的值；
    # item是迭代变量，用于遍历iterable（可迭代对象）中的每个元素。
    #
    # 列表推导式的工作原理是：
    #
    # 遍历iterable中的每个元素，每次遍历将当前元素赋值给item。
    # 对每个item，计算expression的值，并将这个值作为新列表的一个元素。
    # 所有计算得到的值组成一个新的列表。
    # -------------------------------------- #

    # 创建一个包含1到10的平方的列表
    squares = [x ** 2 for x in range(1, 11)]
    print(squares)  # 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    # -------------------------------------- #
    # 列表推导式还可以包含【条件表达式】，用于过滤元素。
    # -------------------------------------- #

    # 创建一个包含1到10之间偶数的平方的列表
    even_squares = [x ** 2 for x in range(1, 11) if x % 2 == 0]
    print(even_squares)  # 输出: [4, 16, 36, 64, 100]

def learn_list3():
    # -------------------------------------- #
    # 语法
    # 列表的【加法】和【数乘】的语法讲解
    # 该语法涉及了 + 和 *
    # -------------------------------------- #

    # -------------------------------------- #
    # 当 + 用于两个列表时，它会进行列表的连接操作，而非元素级的复制。
    # -------------------------------------- #

    # 连接两个列表【列表的加法】
    list1 = [1, 2, 3]
    list2 = [4, 5, 6]
    combined = list1 + list2  # 使用加号连接
    print(combined)  # 输出: [1, 2, 3, 4, 5, 6]
    # 类似于列表的extend()方法
    list1.extend(list2)
    print(list1)  # 输出: [1, 2, 3, 4, 5, 6]

    # -------------------------------------- #
    # 当 * 用于一个列表和一个整数时，它会进行列表的复制操作
    # list1 * 3【创建了list1的一个新列表】，其中【包含了list1的三个副本】。
    # 重要的是要注意，这里的复制是浅复制（shallow copy），
    # ->如果list1包含的是可变对象（如列表或字典），那么这些对象本身不会被复制，【而是它们的引用被复制】
    # -------------------------------------- #

    # 列表的数乘
    # 复制列表三次
    list1 = [1, 2, 3]
    repeated = list1 * 3
    print(repeated)  # 输出: [1, 2, 3, 1, 2, 3, 1, 2, 3]
    pass


if __name__ == '__main__':
    # 创建二维列表
    learn_list1()
    # 使用列表推导式来创建列表
    # learn_list2()
    # 列表的加法和数乘
    # learn_list3()